package top.szhome.system.service;

import top.szhome.framework.starter.db.support.SimpleService;
import top.szhome.system.convert.DeptConverter;
import top.szhome.system.entity.Dept;
import top.szhome.system.dto.DeptDTO;
import top.szhome.system.vo.DeptVO;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * 部门 服务定义
 *
 * @author 唐加利
 * @date 2023/07/31
 **/
public interface DeptService extends SimpleService<DeptConverter, DeptDTO, Dept, DeptVO> {

    /**
     * 获取全量部门
     * @param tree 是否以树形结构返回
     * @return
     */
    List<DeptVO> all(boolean tree);

    /**
     * 获取全量部门，以树形结构返回
     * @return
     */
    default List<DeptVO> all() {
        return all(true);
    }

    /**
     * 获取下级部门列表，默认包含下级部门的下级部门
     *
     * @param deptId    指定部门
     * @return 返回指定部门的直接下级部门
     */
    default List<DeptVO> getChildren(Long deptId) {
        return getChildren(deptId, false);
    }

    /**
     * 获取下级部门列表
     *
     * @param deptId    指定部门
     * @param direct    是否仅获取直接下级部门
     * @return 返回指定部门的下级部门，根据设定决定是否返回下级部门的下级部门
     */
    List<DeptVO> getChildren(Long deptId, boolean direct);

    /**
     * 获取父级部门列表
     * @param deptId
     * @return 返回父节点列表，其中第1个元素为部门直接上级部门，最后一个元素为根元素。如果deptId为根元素，则返回空列表
     */
    List<DeptVO> getParents(@NotNull Long deptId);
}
